#ifndef CTPMD_H
#define CTPMD_H

#include <string>
#include <map>
#include "ThostFtdcMdApi.h"

#define CTP_QUOTE_SO ("../lib/thostmduserapi_se.so")
#define CTP_TRADE_SO ("../lib/thosttraderapi_se.so")

// 行情
#define _CreateFtdcMdApi ("_ZN15CThostFtdcMdApi15CreateFtdcMdApiEPKcbb")

// 交易
#define _CreateFtdcTraderApi ("_ZN19CThostFtdcTraderApi19CreateFtdcTraderApiEPKc")

class MdSpi : public CThostFtdcMdSpi
{
public:
    // 构造函数, 初始化行情线程
    MdSpi(CThostFtdcMdApi *pMdApi, std::string path = "./Datas");

    // 析构函数, 释放行情线程
    ~MdSpi();

    // 当客户端与交易后台建立起通信连接时（还未登录前），该方法被调用。
    void OnFrontConnected();

    // 登录请求响应
    void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);

    // 订阅行情应答
    void OnRspSubMarketData(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);

    // 深度行情通知
    void OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData);

private:
    std::string __savePath;                         // 行情数据保存路径
    CThostFtdcMdApi *__pMdUserApi = nullptr;        // CTP行情API指针
    std::string __tradingDay;                       // 交易日
    std::map<std::string, std::string> __saveFiles; // 保存文件映射
    std::map<std::string, int> __saveDataNums;      // 保存数据数量
};
#endif